package com.acmen.easyapi.generator;

import com.acmen.easyapi.annotation.Param;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import java.util.regex.Pattern;

/**
 * In数据获取器
 *
 * @author acmen
 * @date 2022-04-06
 */
@Component
public class InDataGenerator implements DataGenerator {
    private final static String PATTERN = "^in\\([\\s\\S]*(,[\\s\\S]*)*\\)$";

    @Override
    public boolean matches(Field field, Param param) {
        boolean isMatch = Pattern.matches(PATTERN, param.testData())
                ||Pattern.matches(PATTERN, param.validateExp());
        return isMatch;
    }

    @Override
    public Object generate(Field field, Param param) {
         // 利用正则匹配模式匹配参数的测试数据，如果匹配成功则返回测试数据，否则返回参数的校验表达式
        String exp = Pattern.matches(PATTERN, param.testData()) ? param.testData() : param.validateExp();
        exp = exp.trim(); // 去除表达式两端的空格
        exp = exp.substring("in(".length()); // 去除表达式中的"in("部分
        exp = exp.substring(0, exp.length() - 1); // 去除表达式末尾的")"部分
        // 将表达式按照逗号分隔为字符串数组
        String[] dataArray = exp.split(",");
        Random random = new Random();

        // 如果字段的类型是数组或者可实例化为集合的类，则生成一个数据列表
        if (field.getType().isArray() || Collection.class.isAssignableFrom(field.getType())) {
            List datas = new ArrayList();
            for (int i = 0; i < 3; i++) {
                // 随机选取一个数据
                int idx = random.nextInt(dataArray.length);
                datas.add(dataArray[idx]);
            }
            return datas;
        } else {
            // 随机选取一个数据
            int idx = random.nextInt(dataArray.length);
            if (field.getClass().equals(Integer.class)
                    || field.getClass().equals(Short.class)
                    || field.getClass().equals(Long.class)
                    || field.getClass().getName().equals("int")
                    || field.getClass().getName().equals("short")
                    || field.getClass().getName().equals("long")) {
                // 转换为长整型返回
                return Long.parseLong(dataArray[idx]);
            } else if (field.getClass().equals(Float.class)
                    || field.getClass().equals(Double.class)
                    || field.getClass().getName().equals("float")
                    || field.getClass().getName().equals("double")) {
                // 转换为长整型返回
                return Long.parseLong(dataArray[idx]);
            }
            return dataArray[idx];
        }

    }

    /**
     * 数据获取说明
     *
     * @return
     */
    @Override
    public String getNote() {
        String note = "in(a,b,c)：";
        note += "当@ReqParam.testData'in(a,b,c)'时随机生成从a,b,c中获取一个数据。";
        return note;
    }
}
